package demo8

import (
	"fmt"
)

// TestDemo86 单向通道——通道中的单行道
func TestDemo86() {
	/*
		demo1: 单向通道的声明格式
			1. 我们在将一个 channel 变量传递到一个函数时，可以通过将其指定为单向 channel 变量，
			从而限制该函数中可以对此 channel 的操作，比如只能往这个 channel 写，或者只能从这个 channel 读。
			2. 单向 channel 变量的声明非常简单，只能发送的通道类型为chan<-，只能接收的通道类型为<-chan，格式如下：
				2.1 	var 通道实例 chan<- 元素类型    // 只能发送通道
				2.2 	var 通道实例 <-chan 元素类型    // 只能接收通道
	*/
	ch := make(chan int)
	// 声明一个只能发送的通道类型, 并赋值为ch
	var chSendOnly chan<- int = ch
	//声明一个只能接收的通道类型, 并赋值为ch
	var chRecvOnly <-chan int = ch

	ch <- 0

	chSendOnly <- 1
	res1 := <-chRecvOnly

	fmt.Println(chSendOnly)
	fmt.Println(chRecvOnly)
	fmt.Println(res1)

	// 使用 make 创建通道时，也可以创建一个只发送或只读取的通道：
	ch2 := make(<-chan int)

	var chReandOnly2 <-chan int = ch

	res2 := <-chReandOnly2
	fmt.Println(ch2)
	fmt.Println(chReandOnly2)
	fmt.Println(res2)

	/*
		demo2: 关闭 channel
		  1. 关闭 channel 非常简单，直接使用 Go语言内置的 close() 函数即可
	*/

	// 如何判断一个 channel 是否已经被关闭
	res, ok := <-ch2

	fmt.Println(res)
	fmt.Println(ok)

	// 关闭 channel
	close(ch)
}
